package com.cn.common.utils;

import com.cn.bean.vo.EM.partRegt.PageInfo;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class JsonConverter {
    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 将给定的 info 对象, entity 列表和 pageInfo 对象转换为 JSON 字符串。
     *
     * @param info     任意类型的对象，包含用户和部门信息
     * @param entity   List<Object> 类型的对象列表，包含实体信息，可以为空
     * @param pageInfo PageInfo 类型的对象，包含分页信息，可以为空
     * @return 格式化的 JSON 字符串
     * @throws JsonProcessingException 当 JSON 处理出错时抛出
     */
        public static <T> String convertToCustomJson(Object info, List<T> entity, PageInfo pageInfo) throws JsonProcessingException {
        ObjectNode rootNode = objectMapper.createObjectNode();

        // 添加 info 对象
//        rootNode.set("info", objectMapper.valueToTree(info));
        //没有用
//        if (info == null) {
//            rootNode.put("info", ""); // 如果 info 为 null，则设置为空字符串
//        } else {
//            rootNode.set("info", objectMapper.valueToTree(info));
//        }
        ObjectNode infoNode = objectMapper.createObjectNode();
        if (info != null) {
            ObjectMapper infoMapper = new ObjectMapper();
            JsonNode infoJsonNode = infoMapper.valueToTree(info);
            Iterator<Map.Entry<String, JsonNode>> fieldsIterator = infoJsonNode.fields();
            while (fieldsIterator.hasNext()) {
                Map.Entry<String, JsonNode> field = fieldsIterator.next();
                String fieldName = field.getKey();
                JsonNode fieldValue = field.getValue();
                if (fieldValue.isNull()) {
                    infoNode.put(fieldName, ""); // 如果字段的值为 null，则设置为空字符串
                } else {
                    infoNode.set(fieldName, fieldValue);
                }
            }
        }
        rootNode.set("info", infoNode);

        // 处理 entity 列表（可以为空或为空列表）
        ArrayNode entityNode = objectMapper.createArrayNode();
        if (entity != null && !entity.isEmpty()) {
            for (T item : entity) {
                if (item != null) {
                    JsonNode itemNode = objectMapper.valueToTree(item);
                    // Create a new ObjectNode to store non-null values
                    ObjectNode nonNullItemNode = objectMapper.createObjectNode();
                    Iterator<Map.Entry<String, JsonNode>> itemFields = itemNode.fields();
                    while (itemFields.hasNext()) {
                        Map.Entry<String, JsonNode> itemField = itemFields.next();
                        if (itemField.getValue().isNull()) {
                            nonNullItemNode.put(itemField.getKey(), ""); // Set empty string if the field's value is null
                        } else {
                            nonNullItemNode.set(itemField.getKey(), itemField.getValue());
                        }
                    }
                    entityNode.add(nonNullItemNode);
                } else {
                    // If the element is null, add it as an empty string
                    entityNode.add("");
                }
            }
        }
        rootNode.set("entity", entityNode);


        // 处理 pageInfo 对象（可以为空）
        ObjectNode pageNode = rootNode.putObject("pageInfo");
        if (pageInfo != null) {
            pageNode.put("page", pageInfo.getPage());
            pageNode.put("limit", pageInfo.getLimit());
        } else {
            // 提供默认值
            pageNode.put("page", 1);
            pageNode.put("limit", 10);
        }
        // Convert to JSON string
        return objectMapper.writeValueAsString(rootNode);
    }
}
